package com.example.daibanshiwu.controller;


import com.example.daibanshiwu.Service.MessageService;
import com.example.daibanshiwu.pojo.*;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.websocket.server.PathParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/message")
public class MessageController {

    @Autowired
    private MessageService messageService;

    @GetMapping("/getAll/{sendUserId}")
    public Result getAll(@PathVariable("sendUserId") int sendUserId) {
        System.out.println("getAll+sendUserId="+sendUserId );
        List<Message> messages = messageService.getMessageAll(sendUserId);
//        System.out.println(messages);
        return Result.success(messages);
    }
    @PostMapping("/add")
    public Result add(@RequestBody Message message) {
        System.out.println("add~~");
        System.out.println(message);
        String id = messageService.addMessage(message);
        System.out.println("=======================>");
        System.out.println(id);
        if (id!=null) return Result.success(id);
        return Result.error("添加失败");
    }
    @PutMapping("/update")
    public Result update() {
        return null;
    }
    @PostMapping("/excel")
    public Result Excel(@RequestParam("excelData") MultipartFile file, @RequestParam("id") String id) throws IOException  {
        System.out.println("excel~~");
        System.out.println(file.getOriginalFilename());
        System.out.println(id);
        int i = messageService.addExcel(file, id);
        System.out.println("000000");
        System.out.println(i);
        if (i!=0) return Result.success("添加成功");
        return Result.error("添加失败");
    }
    @PostMapping("/file")
    public Result file(@RequestParam("fileData") MultipartFile file, @RequestParam("id") String id) throws IOException {
        System.out.println("file~~");
        int i = messageService.addFile(file, id);
        if (i!=0) return Result.success("添加成功");
        return Result.error("添加失败");
    }
    @GetMapping("/group")
    public Result group(@RequestParam int userId) {
        System.out.println("group~~");
        System.out.println(userId);
        List<Map<String,Object>> i = messageService.getGroups(userId);
        List<Object> groupList = new ArrayList<>();
        for (Map<String,Object> map : i) {
            groupList.add(map.values());
        }
        if (i!=null) return Result.success(groupList);
        return Result.error("添加失败");
    }
    @GetMapping("/getFile/{id}")
    public void getFile(@PathVariable("id")String id, HttpServletResponse response) throws IOException {
        File file = messageService.getFile(id);
//        System.out.println(file);
        // 1. 根据 fileId 从数据库查询文件信息（包括文件名和文件数据）
        // 假设返回一个包含 fileName 和 fileData (byte[]) 的对象

        if (file == null) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        // 2. 设置HTTP响应头，这是关键！
        // a. 设置内容类型(MIME Type)，让浏览器知道这是什么文件
        //    为了通用性，可以设置为 application/octet-stream，这会强制浏览器下载
        response.setContentType("application/octet-stream");

        // b. 设置Content-Disposition，告诉浏览器文件名，并建议作为附件下载
        //    对文件名进行URL编码，以防止中文或特殊字符乱码
        String encodedFileName = URLEncoder.encode(file.getFileName(), "UTF-8").replaceAll("\\+", "%20");
//        response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");

        // 如果想让图片、PDF等在浏览器内直接预览而不是下载，可以设置为 'inline'
         response.setHeader("Content-Disposition", "inline; filename=\"" + encodedFileName + "\"");

        // 3. 将文件二进制数据写入响应流
        response.getOutputStream().write(file.getFileData());
        response.getOutputStream().flush();
    }
    @GetMapping("/getExcel/{id}")
    public void getExcel(@PathVariable("id")String id, HttpServletResponse response) throws IOException {
        File file = messageService.getExcel(id);
        if (file == null) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        // a. 设置内容类型(MIME Type)，让浏览器知道这是什么文件
        //    为了通用性，可以设置为 application/octet-stream，这会强制浏览器下载
        response.setContentType("application/octet-stream");

        // b. 设置Content-Disposition，告诉浏览器文件名，并建议作为附件下载
        //    对文件名进行URL编码，以防止中文或特殊字符乱码
        String encodedFileName = URLEncoder.encode(file.getExcelName(), "UTF-8").replaceAll("\\+", "%20");
//        response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");

        // 如果想让图片、PDF等在浏览器内直接预览而不是下载，可以设置为 'inline'
        response.setHeader("Content-Disposition", "inline; filename=\"" + encodedFileName + "\"");

        // 3. 将文件二进制数据写入响应流
        response.getOutputStream().write(file.getExcelData());
        response.getOutputStream().flush();
    }

    @GetMapping("/getStatus")
    public Result getStatus(@RequestParam String id) {
        Map<String,Object> status = messageService.getStatus(id);
        return Result.success(status);
    }
    @GetMapping("/getRecord/{id}")
    public Result getRecord(@PathVariable("id") String id) {
        List<ProcessingRecord> records = messageService.getRecords(id);
        return Result.success(records);
    }
    @PostMapping("/getMember")
    public Result getGroupAllUser( @RequestBody List<Integer> groupIds) {
        List<GroupMember> members = messageService.getGroupMembers(groupIds);
        return Result.success(members);
    }

    @GetMapping("/getRecordFile/{id}")
    public void getRecordFile(@PathVariable("id")String id, HttpServletResponse response) throws IOException {
        ProcessingRecord file = messageService.handleRecordFile(Integer.parseInt(id));
//        System.out.println(file);
        // 1. 根据 fileId 从数据库查询文件信息（包括文件名和文件数据）
        // 假设返回一个包含 fileName 和 fileData (byte[]) 的对象

        if (file == null) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        // 2. 设置HTTP响应头，这是关键！
        // a. 设置内容类型(MIME Type)，让浏览器知道这是什么文件
        //    为了通用性，可以设置为 application/octet-stream，这会强制浏览器下载
        response.setContentType("application/octet-stream");

        // b. 设置Content-Disposition，告诉浏览器文件名，并建议作为附件下载
        //    对文件名进行URL编码，以防止中文或特殊字符乱码
        String encodedFileName = URLEncoder.encode(file.getAttachmentFilename(), "UTF-8").replaceAll("\\+", "%20");
//        response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");

        // 如果想让图片、PDF等在浏览器内直接预览而不是下载，可以设置为 'inline'
        response.setHeader("Content-Disposition", "inline; filename=\"" + encodedFileName + "\"");

        // 3. 将文件二进制数据写入响应流
        response.getOutputStream().write(file.getAttachmentContent());
        response.getOutputStream().flush();
    }

}
